package com.bruce.exec.utils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

/**
 * Windows 和 unix 系统 Process process = Runtime.getRuntime().exec() 的一些区别
 * windows 下得到 process 是 cmd进程， 不是 任务进程。即任务进程的父进程。
 * Unix 下 process 是 任务进程。可以直接 用来 获取 pid 和 kill
 *
 * @author xin.ding
 */
public interface ProcessHandler {

    /**
     * 获取任务进程id
     *
     * @param process 进程对象
     * @return pid
     */
    String getProcessId(Process process);

    /**
     * 获取任务进程id
     *
     * @param pName 任务程序名
     * @return
     */
    default String getProcessId(String pName) {
        String pid;
        if (pName.endsWith(".jar")) {
            pid = getJarPid(pName);
        } else {
            pid = getOtherPid(pName);
        }
        return pid;
    }

    /**
     * 获取任务进程id
     *
     * @param pName 程序名
     * @return
     */
    String getOtherPid(String pName);

    /**
     * 杀死 任务进程
     *
     * @param process 进程对象
     * @return bool
     */
    boolean killProcess(Process process);

    /**
     * 杀死 任务进程
     *
     * @param pid 进程id
     * @return bool
     */
    boolean killProcess(String pid);

    /**
     * 进程是否存活
     *
     * @param pName 进程名
     * @return bool
     */
    default boolean isActivePName(String pName) {
        String processId = getProcessId(pName);
        return processId == null;
    }

    /**
     * 进程是否存活
     *
     * @param pid 进程Pid
     * @return bool
     */
    boolean isActivePid(String pid);

    /**
     * 获取jar包运行的 pid
     *
     * @param jarName 文件名
     * @return String
     */
    default String getJarPid(String jarName) {
        Runtime runtime = Runtime.getRuntime();
        try {
            Process pro = runtime.exec("jps -l");
            BufferedReader br = new BufferedReader(new InputStreamReader(pro.getInputStream(), StandardCharsets.UTF_8));
            String str = "";
            while ((str = br.readLine()) != null) {
                if (str.trim().equals("") || !str.contains(jarName)) {
                    continue;
                }
                br.close();
                return str.substring(0, str.indexOf(" "));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

}
